/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import entidades.Paisestrad;
import entidades.Usuario;
import java.io.Serializable;
import java.util.ArrayList;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.util.Date;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;
import objetos.ParDeFechas;

/**
 *
 * @author Pablo
 */
@Named(value = "nuevaPropControl")
@SessionScoped
public class NuevaPropController extends ParentController implements Serializable {
    //private List<Paisestrad> destinos;
    private List<SelectItem> destinos;
    private List<SelectItem> fechas;
    private List<ParDeFechas> fechasList;
    private Date fechaIni;
    private Date fechaFin;
    private Integer paisToAdd;
    private Integer numDiasMax;
    private Integer numDiasMin; 
    private Integer planEco;
    private String descriplan;
    private Double costeMin;
    private Double costeMax;
    private String descripcion;
    private Integer destSelect;
    private Integer newDatesEnter;
    private Integer fechasChosen;
    private Boolean viajePublico;
    
    FacesContext context;
    HttpSession session;
    
       
    public NuevaPropController() {
        //destinos = new ArrayList<>();
        fechas = new ArrayList<>();
        fechasList = new ArrayList<>();
        destinos = new ArrayList<>();
        fechaIni = new Date();
        fechaFin = new Date();
        newDatesEnter = 1;
        
        destinos.add(new SelectItem(0,"..."));
        fechas.add(new SelectItem(0,"..."));
    }

    public void listenFechaIniChange (){
        fechaIni = null;
    }
    
    public void addDestino(){
        Paisestrad paisTrad = null;
        if (paisToAdd != -1){
            if (destinos.size()==1 && destinos.get(0).getValue().equals(0))
                destinos.remove(0);
            int i = 0;
            boolean esta = false;
            while (i<destinos.size() && !esta){            
                if (destinos.get(i).getValue().equals(paisToAdd)){
                    esta = true;
                }
                i++;
            }
            if (!esta){
                paisTrad = propuestaService.getPaisTrad(
                        propuestaService.getPais(paisToAdd), idioma);            
                destinos.add(new SelectItem (paisTrad.getIdPais().getIdPais(), 
                        paisTrad.getNombre()));
            }
        }    
    }
    
    public void deletePais(){
        if(destSelect != null){   
            int i = 0;
            boolean fin = false;
            while (i<destinos.size() && !fin){            
                if (destinos.get(i).getValue().equals(destSelect)){
                    destinos.remove(i);
                    fin = true;
                }
                i++;
            }
        }
    }
    
    public void addParFecha(){
        // Eliminar linea en blanco si está
        if (fechas.size()==1 && fechas.get(0).getValue().equals(0))
                fechas.remove(0);
        // Comprobar si las fechas introducidas se solapan con las que hay
        int i = 0;
        boolean solapadas = false;
        while (i<fechasList.size() && !solapadas){ 
            if (fechaIni.after(fechasList.get(i).getFechaIni())){
                if (!fechaIni.after(fechasList.get(i).getFechaFin())){
                    solapadas = true;
                }
            }
            else{
                if (!fechaFin.before(fechasList.get(i).getFechaIni())){
                    solapadas = true;
                }
            }
            i++;
        }
        if (solapadas){
            //Mostrar error            
            createMessageError("newproposal:fechas","date_covered_up");
        }
        else{
            //Introducir fecha en la lista
            ParDeFechas par = new ParDeFechas(fechaIni, fechaFin);
            fechas.add(new SelectItem(newDatesEnter, par.toString()));
            newDatesEnter ++;
            fechasList.add(par);
        }
    }
    
    public void deleteFecha(){
        //if(fechasSelect != null){
        if(fechasChosen != null){
            int i = 0;
            boolean fin = false;
            while (i<fechas.size() && !fin){ 
                if (fechas.get(i).getValue().equals(fechasChosen)){
                    fechas.remove(i);
                    fechasList.remove(i);
                    fin = true;
                }
                i++;
            }
        }
    }
    
    public void listenNDiasMinChange(){
        numDiasMin = null;
    }
    
    public void listenCostChange(){
        
    }
    
    public void listenPlanChange (){
        if (planEco == null)
            descriplan = "";
        else{
            for (int i = 0; i<getPlEcoSelect().size(); i++){
                if (getPlEcoSelect().get(i).getValue().equals(planEco))
                    descriplan = getPlEcoSelect().get(i).getDescription();
            }
        }
    }
    
    public void saveProposal(){
        context = FacesContext.getCurrentInstance();
        session = (HttpSession) context.getExternalContext().getSession(true);
        Usuario usuario = (Usuario)session.getAttribute("usuario");
        propuestaService.insertProposal(usuario, (ArrayList)destinos, (ArrayList)fechas, 
                costeMax, costeMin, numDiasMax, numDiasMin, planEco, descripcion, viajePublico);
    }
    
    //Getters and setters
    
    public List<SelectItem> getFechas() {
        return fechas;
    }

    public void setFechas(List<SelectItem> fechas) {
        this.fechas = fechas;
    }

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Integer getPaisToAdd() {
        return paisToAdd;
    }

    public void setPaisToAdd(Integer paisToAdd) {
        this.paisToAdd = paisToAdd;
    }

    public Integer getNumDiasMax() {
        return numDiasMax;
    }

    public void setNumDiasMax(Integer numDiasMax) {
        this.numDiasMax = numDiasMax;
    }

    public Integer getNumDiasMin() {
        return numDiasMin;
    }

    public void setNumDiasMin(Integer numDiasMin) {
        this.numDiasMin = numDiasMin;
    }

    public Integer getPlanEco() {
        return planEco;
    }

    public void setPlanEco(Integer planEco) {
        this.planEco = planEco;
    }

    public String getDescriplan() {
        return descriplan;
    }

    public void setDescriplan(String descriplan) {
        this.descriplan = descriplan;
    }

    public Double getCosteMin() {
        return costeMin;
    }

    public void setCosteMin(Double costeMin) {
        this.costeMin = costeMin;
    }

    public Double getCosteMax() {
        return costeMax;
    }

    public void setCosteMax(Double costeMax) {
        this.costeMax = costeMax;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public List<SelectItem> getDestinos() {
        return destinos;
    }

    public void setDestinos(List<SelectItem> destinos) {
        this.destinos = destinos;
    }

    public Integer getDestSelect() {
        return destSelect;
    }

    public void setDestSelect(Integer destSelect) {
        this.destSelect = destSelect;
    }

    public Integer getFechasChosen() {
        return fechasChosen;
    }
    
    public void setFechasChosen(Integer fechasChosen) {
        this.fechasChosen = fechasChosen;
    }

    public Boolean getViajePublico() {
        return viajePublico;
    }

    public void setViajePublico(Boolean viajePublico) {
        this.viajePublico = viajePublico;
    }

    
}
